package com.badger.generator.util;

import static com.badger.generator.constant.BuildTextConstant.LINE_SEPARATOR;
import static com.badger.generator.constant.BuildTextConstant.TABS;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;

import com.badger.generator.entity.TableField;

/**
 * 构建文本的工具类
 * @author liqi
 *
 */
public final class BuildTextUtils {
    /**
     * 导入成员变量所需要的jar包
     * @param list
     * @param sb
     */
    public static Set<String> importClass(List<TableField> list) {
        return list.stream().filter(field -> field.getDataBaseType().getPkg() != null)
                .map(feild -> feild.getDataBaseType().getPkg()).collect(Collectors.toSet());
    }

    /**
     * 构建类上面的注释
     * @param comment
     * @param userName 
     * @return
     */
    public static StringBuilder buildClassComment(StringBuilder sb, String comment, String author) {
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        sb.append("/**").append(LINE_SEPARATOR);
        sb.append(" * ").append(comment).append(".").append(LINE_SEPARATOR);
        sb.append(" * @author ").append(author).append(LINE_SEPARATOR);
        sb.append(" * @date ").append(sdf.format(date)).append(LINE_SEPARATOR);
        sb.append(" */").append(LINE_SEPARATOR);
        return sb;
    }

    /**
     * 构建字段上面的注释
     * @param sb
     * @param comment
     * @return
     */
    public static StringBuilder buildFieldComment(StringBuilder sb, String comment) {
        if (!StringUtils.isEmpty(comment)) {
            sb.append(TABS).append("/**").append(comment).append(".*/").append(LINE_SEPARATOR);
        }
        return sb;
    }

    /**
     * 构建get方法上的注释
     * @param sb
     * @param comment
     * @param fieldName 字段名称
     * @param fieldType 字段类型
     * @return
     */
    public static StringBuilder buildGetComment(StringBuilder sb, String comment, String fieldName, String fieldType) {
        sb.append(TABS).append("/**").append(LINE_SEPARATOR);
        sb.append(TABS).append(" * 获取").append(comment).append('.').append(LINE_SEPARATOR);
        sb.append(TABS).append(" * @return ").append(fieldType).append(" ").append(fieldName).append(LINE_SEPARATOR);
        sb.append(TABS).append(" */").append(LINE_SEPARATOR);
        return sb;
    }

    /**
     * 构建set方法上的注释
     * @param sb
     * @param comment
     * @param fieldName
     * @return
     */
    public static StringBuilder buildSetComment(StringBuilder sb, String comment, String fieldName) {
        sb.append(TABS).append("/**").append(LINE_SEPARATOR);
        sb.append(TABS).append(" * 设置").append(comment).append(".").append(LINE_SEPARATOR);
        sb.append(TABS).append(" * @param ").append(fieldName).append(" ").append(comment).append(LINE_SEPARATOR);
        sb.append(TABS).append(" */").append(LINE_SEPARATOR);
        return sb;
    }

    /**
     * 给字段加双引号
     * @param str
     * @return
     */
    public static String addQuote(String str) {
        return String.format("\"%s\"", str);
    }

    /**
     * 驼峰命名，首字母小写 主要用作成员变量，局域变量等
     * @param text
     * @return
     */
    public static String humpFirstLetterLowerCase(String text) {
        String str = hump(text);
        return str.substring(0, 1).toLowerCase() + str.substring(1);
    }

    /**
     * 驼峰命名，首字母大写 主要用作表名，get和set方法
     * @param text
     * @return 
     */
    public static String hump(String text) {
        return hump(text, null);
    }

    /**
     * 驼峰命名，首字母大写 主要用作表名，get和set方法
     * @param text 表名
     * @param includePrefix 根据表名，生成类名，去掉的表前缀的集合 可以为空 
     * @return 
     */
    public static String hump(String text, List<String> includePrefix) {
        // 驼峰命名直接返回
        if (!text.contains("_")) {
            if (StringUtils.isUpperCase(text)) {
                // 纯大写命名，转为小写属性
                String str = text.toLowerCase();
                return str.substring(0, 1).toUpperCase() + str.substring(1);
            }
            return text.substring(0, 1).toUpperCase() + text.substring(1);
        }
        String[] tables = text.split("_");
        final int s = Optional.ofNullable(includePrefix).filter(fix -> fix.indexOf(tables[0].toUpperCase()) > -1)
                .map(fix -> 1).orElse(0);
        StringBuilder sb = new StringBuilder();
        for (int i = s; i < tables.length; i++) {
            String temp = tables[i].trim();
            sb.append(temp.substring(0, 1).toUpperCase()).append(temp.substring(1).toLowerCase());
        }
        return sb.toString();
    }

    /**
     * 生成文件地址
     * @param segment  文件地址片段
     * @return
     */
    public static String getFilePath(String savePath, String segment) {
        File folder = new File(savePath + File.separator + segment);
        if (!folder.exists()) {
            folder.mkdirs();
        }
        return folder.getPath();
    }

    /**
     * 给整个包路径地址，取最后的类名
     * eg : cn.net.yto.vipcrm.comms.base.entity.BaseEntity 取BaseEntity
     * @param parentPath 包路径
     * @return 最后的类名
     */
    public static String getParentPathName(final String parentPath) {
        String[] data = parentPath.split("\\.");
        return data[data.length - 1];
    }
}
